package com.zsy.springframework.beans.factory.beanfactory;

import com.zsy.springframework.BeansException;
import com.zsy.springframework.beans.factory.config.BeanDefinition;
import com.zsy.springframework.beans.factory.jiekou.BeanFactory;

//综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能。
//继承了包含单例对象，实现了获取对象的接口，所以这个抽象类 目的是为了实现接口的功能，对外提供bean的真实的对象
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

    //具体是怎么获取对象对外提供beanfactory的实现呢？？？？
    @Override
    public Object getBean(String beanName) throws BeansException {
        Object singleton = getSingleton(beanName);
        if (singleton != null) {
            return singleton;
        }
        //此时这个从单例池中获取的对象是空的
//        所以需要获取bean的定义对象，从而拿到对象的信息，然后进行创建对象
//        需要获取bean的定义信息，然后再根据信息创建，这里不能实现，需要子类来继承实现
        BeanDefinition beanDefinition = getBeanDefinition(beanName);

        return createBean(beanName, beanDefinition);
    }

    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException;

    protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException;
}
